iT邦幫忙

2025 iThome 鐵人賽

DAY 3
0
AI & Data

雲端情人 - AI 愛系列 第 3

Day 3:人機介面 - LINE Messaging API 初體驗

  • 分享至 

  • xImage
  •  

Echo Bot 打通管線

在電影《雲端情人》裡,能自然對話的人機介面是故事的核心。
要讓「AI 雲端情人」能和我互動,第一步就是建立一個 友好的人機介面

我選擇大家熟悉的 LINE 作為主要入口,透過 LINE Messaging API 搭配 FastAPI 架設 Webhook,讓使用者訊息能流入我的系統。

使用者在 LINE 發送文字後,LINE 會把事件透過 Webhook POST 到我的後端 /callback。我利用 line-bot-sdk 解析事件並回覆。本篇完成一個最小可行版本 Echo Bot:用戶傳什麼、我就回什麼,用來驗證整條資料流是否「打通」。

https://ithelp.ithome.com.tw/upload/images/20250828/201121002nU93FZrjU.png

💡 參考資料


💻 FastAPI Echo Bot 程式碼

# app.py
# 最小可行 LINE Echo Bot(FastAPI 版本)

import os
from typing import Dict, Any
from fastapi import FastAPI, Header, HTTPException, Request
from fastapi.responses import JSONResponse

from linebot import LineBotApi, WebhookParser
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage

CHANNEL_SECRET = os.getenv("CHANNEL_SECRET")
CHANNEL_ACCESS_TOKEN = os.getenv("CHANNEL_ACCESS_TOKEN")
if not CHANNEL_SECRET or not CHANNEL_ACCESS_TOKEN:
    raise RuntimeError("請設定環境變數 CHANNEL_SECRET / CHANNEL_ACCESS_TOKEN")

line_bot_api = LineBotApi(CHANNEL_ACCESS_TOKEN)
parser = WebhookParser(CHANNEL_SECRET)

app = FastAPI(title="AI 雲端情人 - Day 3 Echo Bot")

@app.get("/healthz")
async def healthz() -> Dict[str, Any]:
    return {"ok": True}

@app.post("/callback")
async def callback(request: Request, x_line_signature: str = Header(None)) -> JSONResponse:
    if x_line_signature is None:
        raise HTTPException(status_code=400, detail="Missing X-Line-Signature")

    body_text = (await request.body()).decode("utf-8")

    try:
        events = parser.parse(body_text, x_line_signature)
    except InvalidSignatureError:
        raise HTTPException(status_code=400, detail="Invalid signature")

    for event in events:
        if isinstance(event, MessageEvent) and isinstance(event.message, TextMessage):
            try:
                line_bot_api.reply_message(
                    event.reply_token,
                    TextSendMessage(text=event.message.text)  # Echo:原文回覆
                )
            except Exception as e:
                print(f"[ERROR] reply_message failed: {e}")

    return JSONResponse({"status": "ok"})
    

https://ithelp.ithome.com.tw/upload/images/20250829/20112100yU6iEiPcPh.png


上一篇
Day 2:整體構想與設計藍圖
下一篇
Day 4 - 天網來了!雲端情人上雲 — 部署到 Render,綁定 Webhook
系列文
雲端情人 - AI 愛13
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言